package mt.dummy;

import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;

import mt.Order;
import mt.client.GUI;
import mt.client.MicroTraderClient;
import mt.comm.ClientComm;
import mt.comm.ClientSideMessage;

/**
 * 
 * @author Samuel Martins Nº38011, Diogo Simões Nº55494, António Costa
 *         Nº54758
 * 
 */
public class MicroTraderClientDummy implements MicroTraderClient, Runnable {
	ClientComm clientComm;

	/**
	 * 
	 * Este método recebe um clientComm para ligar o cliente ao servidor
	 * Executa a GUI com este client (gui.run) Espera por mensagens do servidor.
	 * Destingue as mensagens pelo Type (Order ou Error). Se receber uma order
	 * guarda-a numa linkedlist listaDeOrdens e executa o método
	 * gui.insertHistorico(listaDeOrdens) e gui.showMessages(listaDeOrdens) Se
	 * receber um Error guarda-o numa linkedlist listaDeErros
	 * 
	 * @param ClientComm
	 *            clientComm
	 */

	public void start(ClientComm clientComm) {
		Thread thread = new Thread(this);
		this.clientComm = clientComm;
		thread.start();
	}

	@Override
	public void run() {
		// criação clientComm
		ClientCommDummy client = (ClientCommDummy) clientComm;
		// criaçao GUI
		GUI gui = new GUI(client);
		// criação LinkedList's
		LinkedList<Order> listaDeOrdens = new LinkedList<Order>();
		LinkedList<String> listaDeErros = new LinkedList<String>();
		LinkedList<Order> ordensParaRemover = new LinkedList<Order>();
		LinkedList<Order> ordensParaAdicionar = new LinkedList<Order>();
		// correr a gui
		gui.run();
		// ciclo while que permite ficar a receber mensagens do servidor
		while (true) {
			if (clientComm.hasNextMessage()) {
				ClientSideMessage message = client.getNextMessage();
				// switch Order/Error
				// new message used:
				switch (message.getType()) {

				case ORDER:
					Order order = message.getOrder();
					boolean addOrder = true;
					//System.out.println("Order: " + order + "\nbefore: "
							//+ listaDeOrdens);
					if (listaDeOrdens.isEmpty()) {
						listaDeOrdens.add(order);
					} else {
						for (Order o : listaDeOrdens) {
							if (order.getServerOrderID() == o
									.getServerOrderID()) {
								addOrder = false;
								if (order.getNumberOfUnits() == 0) {
									ordensParaRemover.add(o);
								} else
									o.setNumberOfUnits(order.getNumberOfUnits());
							}
						}
						if (addOrder)
							ordensParaAdicionar.add(order);

					}
					listaDeOrdens.removeAll(ordensParaRemover);
					ordensParaRemover.clear();
					listaDeOrdens.addAll(ordensParaAdicionar);
					ordensParaAdicionar.clear();
					//System.out.println("after: " + listaDeOrdens);

					// executa a função insertHistorico()
					gui.insertHistorico(listaDeOrdens);
					// executa a função showMessages()
					gui.showMessages(listaDeOrdens);

					break;
				case ERROR:
					// adiciona erro à linkedList
					listaDeErros.add(message.getError());
					System.out.println(listaDeErros);
					break;
				default:
					break;
				}
			}
		}
	}
}